from pyramid.config import Configurator

#from .models import DBSession
from pyramid.authentication import AuthTktAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy

from pyramid_beaker import session_factory_from_settings

from sqlalchemy import engine_from_config

from pdm.models import initialize_sql

def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')
    initialize_sql(engine)

    session_factory = session_factory_from_settings(settings)

    authn_policy = AuthTktAuthenticationPolicy('s0secret')
    authz_policy = ACLAuthorizationPolicy()
    
    config = Configurator(
        settings=settings,
        root_factory='pdm.models.RootFactory',
        authentication_policy=authn_policy,
        authorization_policy=authz_policy,
        session_factory=session_factory
    )
    """
    config.add_subscriber('pdm.subscribers.add_base_template',
                          'pyramid.events.BeforeRender')
    config.add_subscriber('pdm.subscribers.csrf_validation',
                          'pyramid.events.NewRequest')
	"""
    config.add_static_view('static', 'pdm:static')    
    
    config.add_route('login_views', '/usuario/login')
    config.add_route('logout', '/usuario/logout')
    config.add_route('recuperar_contrasenha', '/usuario/recuperar/contrasenha')
    config.add_route('recuperar_contrasenha_views', '/recuperar/contrasenha')    
    
    config.add_route('administracion_usuario', '/administracion/usuario')   
    config.add_route('administracion_usuario_listar', '/administracion/usuario/listar')        
    config.add_route('administracion_usuario_agregar', '/administracion/usuario/agregar')        
    config.add_route('agregar_usuario', '/usuario/agregar')
    config.add_route('eliminar_usuario', '/usuario/eliminar')
    config.add_route('modificar_usuario', '/usuario/modificar')     
    config.add_route('listar_usuario', '/usuario/listar')
    config.add_route('relacion_usuario_rol_asignar', '/usuario/rol/relacion/asignar')
    config.add_route('relacion_usuario_rol_desasignar', '/usuario/rol/relacion/desasignar')
    config.add_route('listar_roles_usuario_asignado', '/usuario/rol/listar/asignados')    
    config.add_route('listar_roles_usuario_desasignado', '/usuario/rol/listar/desasignados')        
    
    config.add_route('administracion_rol', '/administracion/rol')    
    config.add_route('administracion_rol_listar', '/administracion/rol/listar')        
    config.add_route('administracion_rol_agregar', '/administracion/rol/agregar')      
    config.add_route('agregar_rol', '/rol/agregar')
    config.add_route('eliminar_rol', '/rol/eliminar')
    config.add_route('modificar_rol', '/rol/modificar')     
    config.add_route('listar_rol', '/rol/listar')
    config.add_route('relacion_rol_usuario_asignar', '/rol/usuario/relacion/asignar')
    config.add_route('relacion_rol_usuario_desasignar', '/rol/usuario/relacion/desasignar')    
    config.add_route('usuario_rol_permiso', '/usuario/rol/permiso')

    config.add_route('listar_permisos', '/permisos/listar')    
    
    config.add_route('administracion_proyecto', '/administracion/proyecto')    
    config.add_route('administracion_proyecto_listar', '/administracion/proyecto/listar')        
    config.add_route('administracion_proyecto_crear', '/administracion/proyecto/crear')          
    config.add_route('agregar_proyecto', '/proyecto/agregar')
    config.add_route('eliminar_proyecto', '/proyecto/eliminar')
    config.add_route('modificar_proyecto', '/proyecto/modificar')     
    config.add_route('listar_proyecto', '/proyecto/listar')

    config.add_route('tipo_item', '/tipo_item')    
    
    config.add_route('index', '/index')

    config.add_route('login', '/')




    config.add_route('home', '/')
    
    
    config.scan()
    
    return config.make_wsgi_app()

